package com.aleyn.annotation

/**
 * @author: Aleyn
 * @date: 2023/7/28 11:28
 * @desc: ViewModel 参数注入注解。
 *
 * 此注解专门用于标记 `ViewModel` 构造函数中的参数。
 * 当一个参数被 `@InParam` 注解时，LRouter 的依赖注入容器会认为这个参数
 * 是从 `ViewModel` 的 `SavedStateHandle` 中获取的，而不是一个需要从 DI 容器中解析的常规依赖。
 *
 * 这对于实现 Android 官方推荐的、通过 `SavedStateHandle` 接收和恢复 `ViewModel` 状态的模式至关重要。
 *
 * 使用示例：
 * ```kotlin
 * @Factory
 * class MyViewModel(
 *     private val userRepository: UserRepository, // 这是一个常规的依赖，将通过 get() 获取
 *     @InParam private val userId: String // 这是一个通过 SavedStateHandle 获取的参数
 * ) : ViewModel() {
 *     // ...
 * }
 * ```
 *
 * 在 KSP（Kotlin Symbol Processing）阶段，当处理器遇到 `@InParam` 注解的参数时，
 * 它会生成类似 `savedStateHandle.get("userId")` 这样的代码来获取参数值，
 * 而对于 `userRepository`，则会生成 `get<UserRepository>()` 来从容器获取依赖实例。
 */
@Retention(AnnotationRetention.SOURCE)
@Target(AnnotationTarget.VALUE_PARAMETER)
annotation class InParam